package com.ding.authorizationserver.service

import org.springframework.beans.factory.annotation.Autowired
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.crypto.password.PasswordEncoder
import org.springframework.security.oauth2.provider.ClientDetails
import org.springframework.security.oauth2.provider.ClientDetailsService
import org.springframework.security.oauth2.provider.ClientRegistrationException
import org.springframework.stereotype.Service

@Service
class ApplyClientDetailService implements ClientDetailsService {

    @Autowired
   PasswordEncoder passwordEncoder

    @Override
    ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {

        /*
       clientId:(必需）客户端ID。
       secret:客户端密钥（如果有）。
       scope：客户受限的范围。如果范围未定义或为空（默认值），则客户端不受范围限制。
       authorizedGrantTypes：授权客户端使用的授权类型。默认值为空。
       authorities：授予客户端的权限（常规Spring Security权限）。
        */

        return new ClientDetails() {
            @Override
            String getClientId() {
                return clientId
            }

            @Override
            Set<String> getResourceIds() {
                def list=new ArrayList<>()
                list.add('a')
                list.add('b')
                return list
            }

            @Override
            boolean isSecretRequired() {
                return true
            }

            @Override
            String getClientSecret() {
                return passwordEncoder.encode('123')
            }

            @Override
            boolean isScoped() {
                return true
            }

            @Override
            Set<String> getScope() {
                def list=new ArrayList<>()
                list.add('all')
                return list
            }

            @Override
            Set<String> getAuthorizedGrantTypes() {
                def list=new ArrayList<>()
                list.add('authorization_code')  //对该客户端开启授权码模式
                list.add('refresh_token')       //对该客户端开启更新令牌功能
                return list
            }

            /**
             *  在验证客户端之后,请求将以认证码、state等作为请求参数重定向到客户端指定的uri
             * @return  可信赖uri列表,客户端指定的uri必须是该列表元素之一
             */
            @Override
            Set<String> getRegisteredRedirectUri() {
                def list=new ArrayList<>()
                list.add('http://localhost/getToken')
                return list
            }

            @Override
            Collection<GrantedAuthority> getAuthorities() {
                List<GrantedAuthority> list = new ArrayList<>()
                list.add new SimpleGrantedAuthority('USER')
                return list
            }

            @Override
            Integer getAccessTokenValiditySeconds() {//访问令牌有效时间
                return 60*60*24
            }

            @Override
            Integer getRefreshTokenValiditySeconds() {//更新令牌有效时间
                return 60*60*24*7
            }

            @Override
            boolean isAutoApprove(String scope) {
                return true
            }

            @Override
            Map<String, Object> getAdditionalInformation() {
                return null
            }
        }
    }
}
